home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d1
/
eddtv4.arc
/
ESETUP40.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-03-28
|
26KB
|
644 lines
.XLIST
PAGE 80,120
EXTRN CMOSREAD:FAR
EXTRN CMOSWRIT:FAR
EXTRN CMOSCHKS:FAR
IF1
PAGE
INCLUDE EDDT_MAC.LIB
ENDIF
PAGE
TITLE OèÄ EDDT - EXTENDED DRIVE SETUP PROGRAM Version 4.00ö
.LIST
.286 ; ENABLE 80286 INSTRUCTIONS
SUBTTL ROUTINE TO ALLOW EXTENDED DRIVE DESCRIPTIONS
COMMENT *
EDSETUP VERSION 4.00
Copyright 1987,1988 Don Gentry
A limited license is granted to all users of this program,
to make copies of this program, and distribute them to
other users, on the following conditions:
1. The notice on this page is not to be removed or altered
2. No fee is to be charged for copying or distributing
the program.
3. No warranty of any kind is offered. This program is offered
on an "AS IS" basis. Each user should verify that it meets
his needs and verify correct operation.
4. No further restrictions on redristribution of any kind may
be required. This includes, but is not limited to,
COMPUSERVE or other program distribution services,
by electronic or other means.
FOR HELP OR SUGGESTIONS WRITE:
DON GENTRY
183 BELLEGROVE CIRCLE
BRANDON, MS 39042
OR CALL (601) 992-0577
*
PAGE
ED_STACK SEGMENT PARA STACK 'STACK'
DB 200 DUP('STACK')
ED_STAK0 EQU $ ; START OF STACK
ED_STACK ENDS
ED_DATA SEGMENT PARA PUBLIC 'DATA' ; CODE SEGMENT
DB 7 ; LENGTH OF ID
DB 'EDSETUP' ; PROGRAM ID
DB 'V4M00' ; VERSION/MODIFICATION LEVEL
;
; ----- DEFINE MESSAGE SCREENS
ED_LOGO1 EQU $
DFLD 01,20,15,'EDDT - EXTENDED DRIVE DESCRIPTION TABLES'
ED_LOGO2 EQU $
DFLD 02,26,15,'EXTENDED DRIVE SETUP PROGRAM'
ED_LOGO3 EQU $
DFLD 03,25,07,'COPYRIGHT 1987,1988 DON GENTRY'
ED_NOTE1 EQU $
DFLD 05,22,70H,'NOTE: SET TYPE TO 00 IF NOT INSTALLED'
ED_HD0 EQU $
DFLD 07,25,07,'ENTER TYPE FOR HARD DRIVE 0: '
ED_HD0IN EQU $
DFLD 07,54,07H,' '
ED_HD1 EQU $
DFLD 09,25,07,'ENTER TYPE FOR HARD DRIVE 1: '
ED_HD1IN EQU $
DFLD 09,54,07H,' '
ED_FD0 EQU $
DFLD 12,24,07,'ENTER TYPE FOR FLOPPY DRIVE 0: '
ED_FD0IN EQU $
DFLD 12,55,07H,' '
ED_FD1 EQU $
DFLD 14,24,07,'ENTER TYPE FOR FLOPPY DRIVE 1: '
ED_FD1IN EQU $
DFLD 14,55,07H,' '
ED_NOTE2 EQU $
DFLD 16,25,07,'VALID FLOPPY DRIVE TYPES ARE:'
ED_NOTE3 EQU $
DFLD 17,21,07
DW ED_N3B-ED_N3A
ED_N3A DB '1 - 360KB 5.25 2 - 1.2MB 5.25'
DB 0AH,0DH,' '
DB '3 - 720KB 3.5 4 - 1.44MB 3.25'
ED_N3B EQU $
ED_CONF EQU $
DFLD 23,24,15,'ACCEPT DRIVE TYPES SELECTED (Y/N)'
ED_BOOT EQU $
DFLD 22,20,15,'NOTE: RE-BOOT TO MAKE CHANGES EFFECTIVE'
ED_INVM1 EQU $
DFLD 10,28,15,'INVALID MACHINE DETECTED'
ED_INVM2 EQU $
DFLD 24,20,15,'SETUP MUST BE RUN ON AN AT OR COMPATIBLE'
ED_INVM3 EQU $
DFLD 24,19,15,'BIOS REQUIRES FLOPPY DRIVE 0 INSTALLATION'
ED_INVMB EQU $
DFLD 24,19,15,' '
;
; ----- PROGRAM CONSTANT AREAS
;
ED_CMOS EQU $ ; CMOS I/O AREA
ED_ETYP0 EQU 019H ; EDDT DRIVE 0 TYPE CMOS BYTE
ED_ETYP1 EQU 01AH ; EDDT DRIVE 1 TYPE CMOS BYTE
ED_FDTYP DB 0 ; FLOPPY DISK DRIVES
DB 0 ; RESERVED
ED_HDTYP DB 0 ; BIOS DRIVE TYPES 1-14
DB 0 ; RESERVED
ED_EQ DB 0 ; EQUIPMENT BYTE
ED_MBML DB 0 ; MOTHER BOARD MEMORY LOW BYTE
ED_MBMH DB 0 ; MOTHER BOARD MEMORY HI BYTE
ED_EXML DB 0 ; EXPANSION MEMORY LOW BYTE
ED_EXMH DB 0 ; EXPANSION MEMORY HI BYTE
ED_HD0E DB 0 ; HARD DRIVE 0 EXTENDED TYPE
ED_HD1E DB 0 ; HARD DRIVE 1 EXTENDED TYPE
DB 19 DUP(0) ; RESERVED
ED_CHKSL DB 0 ; CHECKSUM BYTE LOW
ED_CHKSH DB 0 ; CHECKSUM BYTE HI
;
; ----- INPUT BUFFER FOR HARD DRIVE 0
;
ED_HD0BF DB 04 ; NUMBER OF CHARS TO ACCEPT
ED_HD0BL DB 00 ; NUMBER OF CHARS READ
ED_HD0BD DB 00,00,00,00 ; BUFFER DATA AREA
;
; ----- INPUT BUFFER FOR HARD DRIVE 1
;
ED_HD1BF DB 04 ; NUMBER OF CHARS TO ACCEPT
ED_HD1BL DB 00 ; NUMBER OF CHARS READ
ED_HD1BD DB 00,00,00,00 ; BUFFER DATA AREA
;
; ----- INPUT BUFFER FOR FLOPPY DRIVE 0
;
ED_FD0BF DB 02 ; NUMBER OF CHARS TO ACCEPT
ED_FD0BL DB 00 ; NUMBER OF CHARS READ
ED_FD0BD DB 00,00 ; BUFFER DATA AREA
;
; ----- INPUT BUFFER FOR FLOPPY DRIVE 1
;
ED_FD1BF DB 02 ; NUMBER OF CHARS TO ACCEPT
ED_FD1BL DB 00 ; NUMBER OF CHARS READ
ED_FD1BD DB 00,00 ; BUFFER DATA AREA
;
; ----- COPY THE EDDT EXTENDED DRIVE TABLE
;
.XLIST
INCLUDE EDDTBL40.ASM ; INCLUDE THE DRIVE TABLE
.LIST
ED_DATA ENDS
;
ED_CODE SEGMENT PARA PUBLIC 'CODE' ; CODE SEGMENT
ASSUME CS:ED_CODE,DS:ED_DATA,ES:NOTHING,SS:ED_STACK
ED_MAIN PROC FAR ; DEFINE PROCEDURE
ED_START:
MOV AX,ED_DATA ; GET ADDRESS OF DATA SEGMENT
MOV DS,AX ; PUT IN DS REG
;
; ----- MAKE SURE WE'RE RUNNING ON AN AT
;
MOV AX,0FFFFH ; GET LAST SEGMENT ADDRESS
MOV ES,AX ; IN ES REGISTER
MOV AL,ES:[0EH] ; GET MODEL_BYTE
CMP AL,0FCH ; GOOD AT TYPE ?
JE ED_MODOK ; ...YES - CONTINUE
CMP AL,0FBH ; GOOD AT TYPE ?
JE ED_MODOK ; ...YES - CONTINUE
CLS ; CLEAR THE SCREEN
;
WCS ED_INVM1 ; WRITE ERROR MESSAGE 1
;
WCS ED_INVM2 ; WRITE ERROR MESSAGE 2
;
MOV BX,4 ; BEEP COUNT
CALL ED_BEEP ; BEEEEEEEP!
JMP ED_EXIT ; AND EXIT TO DOS
ED_MODOK:
;
; ----- READ CMOS CONFIGURATION MEMORY
;
LEA DX,ED_CMOS ; GET ADDRESS OF CMOS I/O AREA
CALL CMOSREAD ; READ THE CMOS
;
; ----- PAINT THE INITIAL SCREEN
;
ED_GO:
CLS ; CLEAR THE SCREEN
;
WCS ED_LOGO1 ; WRITE LOGO 1 MESSAGE
;
WCS ED_LOGO2 ; WRITE LOGO 2 MESSAGE
;
WCS ED_LOGO3 ; WRITE LOGO 3 MESSAGE
;
WCS ED_HD0 ; WRITE HD0 MESSAGE
;
WCS ED_HD0IN ; WRITE HD0 INPUT FIELD
;
WCS ED_HD1 ; WRITE HD1 MESSAGE
;
WCS ED_HD1IN ; WRITE HD1 INPUT FIELD
;
WCS ED_FD0 ; WRITE FD0 MESSAGE
;
WCS ED_FD0IN ; WRITE FD0 INPUT FIELD
;
WCS ED_FD1 ; WRITE FD1 MESSAGE
;
WCS ED_FD1IN ; WRITE FD1 INPUT FIELD
;
WCS ED_NOTE1 ; WRITE NOTE 1
;
WCS ED_NOTE2 ; WRITE NOTE 2
;
WCS ED_NOTE3 ; WRITE NOTE 3
;
WCS ED_BOOT ; WRITE BOOT NOTE
;
; ----- READ THE TYPE FOR HARD DRIVE 0
;
CSRP ED_HD0IN ; POSITION CURSOR FOR INPUT
;
ED_HD0RD: ; READ THE TYPE
READK ED_HD0BF ; WAIT FOR INPUT
;
; ----- VALIDATE THE TYPE FOR HARD DRIVE 0
;
CMP ED_HD0BL,00H ; ONLY CARRIAGE RETURN ENTERED ?
JNE ED_HD001 ; ...NO - CONTINUE
ED_HD0E1: ; ERROR ROUTINE
MOV BX,02H ; BEEP DURATION
CALL ED_BEEP ; SOUND BEEP
WCS ED_HD0IN ; CLEAR THE FIELD
CSRP ED_HD0IN ; POSITION CURSOR
JMP ED_HD0RD
ED_HD001:
CMP ED_HD0BL,01H ; ONLY ONE CHARACTER ENTERED ?
JNE ED_HD002 ; ...NO - CONTINUE
;
; ----- ZERO FILL THE LEADING BYTES IN THE BUFFER
;
MOV AH,ED_HD0BD ; GET THE DATA BYTE IN AH
MOV WORD PTR ED_HD0BD,'00' ; LEADING ZERO FILL
MOV ED_HD0BD+2,AH ; PUT THE CHAR IN BFR
ED_HD002:
CMP ED_HD0BL,02H ; ONLY TWO CHARACTER ENTERED ?
JNE ED_HD003 ; ...NO - CONTINUE
;
; ----- ZERO FILL THE LEADING BYTES IN THE BUFFER
;
MOV AX,WORD PTR ED_HD0BD ; GET THE DATA BYTES IN AX
MOV ED_HD0BD,'0' ; LEADING ZERO FILL
MOV WORD PTR ED_HD0BD+1,AX ; DATA BACK TO BUFFER
ED_HD003:
;
; ----- VALIDATE THE CHARACTERS IN THE BUFFER
;
CMP ED_HD0BD,'0' ; IS IT LESS THAN '0'
JB ED_HD0E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD0BD,'2' ; GREATER THAN 2 ?
JA ED_HD0E1 ; ...YES - ERROR
;
CMP ED_HD0BD+1,'0' ; IS IT LESS THAN '0'
JB ED_HD0E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD0BD+1,'9' ; GREATER THAN 9 ?
JA ED_HD0E1 ; ...YES - ERROR
;
CMP ED_HD0BD+2,'0' ; IS IT LESS THAN '0'
JB ED_HD0E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD0BD+2,'9' ; GREATER THAN 9 ?
JLE ED_HD004 ; ...NO - CONTINUE
JMP ED_HD0E1 ; ...YES - ERROR
ED_HD004:
;
; ----- DIGITS ARE GOOD, CONVERT TO BINARY
;
MOV AX,WORD PTR ED_HD0BD+1 ; GET ASCII LOW 2 BYTES
CALL ED_CVB ; CONVERT TO BINARY
CMP ED_HD0BD,'2' ; HIGH DIGIT 2 ?
JNE ED_HD005 ; ...NO - CONTINUE
ADD AX,200D ; ...YES - ADD 200
ED_HD005:
CMP ED_HD0BD,'1' ; HIGH DIGIT A 1
JNE ED_HD006 ; ...NO - CONTINUE
ADD AX,100D ; YES - ADD 100
ED_HD006:
;
CMP AX,15 ; DRIVE TYPE 15 SPECIFIED ?
JNE ED_HD007 ; ...NO - CONTINUE
JMP ED_HD0E1 ; ...YES - ERROR
ED_HD007:
CMP AX,ED_MAXE-1 ; TYPE GT MAX EDDT TYPE ?
JLE ED_HD009 ; ...NO - CONTINUE
JMP ED_HD0E1 ; ...YES - ERROR
ED_HD009:
;
; ----- SET THE DRIVE TYPE IN CMOS
;
MOV ED_HD0E,AL ; SET THE EDDT EXTENDED TYPE
;-------------------------------------------------------------- 03/12/88
; 03/12/88
; NOTE: 03/12/88
; IN ORDER TO INITIALIZE INTERRUPT 13H ON SOME 03/12/88
; AT COMPATIBLES FIXED DRIVE 0 MUST BE DEFINED 03/12/88
; IN CMOS. SINCE THE ACTUAL DRIVE MAY NOT HAVE 03/12/88
; A CORRESPONDING IBM DRIVE TYPE WE MUST PICK 03/12/88
; ONE THAT MEETS THE FOLLOWING CRITERIA: 03/12/88
; 03/12/88
; (1) THE TYPE DEFINED MUST HAVE LESS THAT OR 03/12/88
; EQUAL TO THE PHYSICAL DRIVE'S NUMBER OF 03/12/88
; HEADS _AND_ NUMBER OF CYLINDERS. 03/12/88
; 03/12/88
; (2) IF THE PHYSICAL DRIVE HAS MORE THAN 8 03/12/88
; HEADS THE TYPE USED MUST HAVE A CONTROL 03/12/88
; BYTE VALUE OF 08H OR IT MUST NOT USE 03/12/88
; WRITE PRECOMPENSATION. 03/12/88
;-------------------------------------------------------------- 03/12/88
;
; ----- LOCATE THE TABLE ENTRY FOR FIXED DRIVE 0 03/12/88
; 03/12/88
XOR BX,BX ; CLEAR BX 03/12/88
MOV BL,AL ; GET DRIVE TYPE FOR DRIVE 0 03/12/88
DEC BX ; ADJUST FOR TABLE BASE 03/12/88
SHL BX,04H ; *10H FOR TABLE OFFSET 03/12/88
MOV AL,BYTE PTR ED_TABLE+2[BX] ; GET NUMBER OF HEADS 03/12/88
CMP AL,09H ; NINE OR MORE HEADS ? 03/12/88
JNL ED_HDGT8 ; ...YES - GO ADJUST 03/12/88
MOV ED_HDTYP,10H ; SET DRIVE 0 TO BIOS TYPE 1 03/12/88
JMP ED_HD1GO ; DO DRIVE 1 03/12/88
ED_HDGT8: ; 03/12/88
MOV ED_HDTYP,60H ; SET DRIVE 0 TO BIOS TYPE 6 03/12/88
ED_HD1GO: ; 03/12/88
; ----- READ THE TYPE FOR HARD DRIVE 1
;
CSRP ED_HD1IN ; POSITION CURSOR FOR INPUT
;
ED_HD1RD: ; READ THE TYPE
READK ED_HD1BF ; WAIT FOR INPUT
;
; ----- VALIDATE THE TYPE FOR HARD DRIVE 1
;
CMP ED_HD1BL,00H ; ONLY CARRIAGE RETURN ENTERED ?
JNE ED_HD101 ; ...NO - CONTINUE
ED_HD1E1: ; ERROR ROUTINE
MOV BX,02H ; BEEP DURATION
CALL ED_BEEP ; SOUND BEEP
WCS ED_HD1IN ; CLEAR THE FIELD
CSRP ED_HD1IN ; POSITION CURSOR
JMP ED_HD1RD
ED_HD101:
CMP ED_HD1BL,01H ; ONLY ONE CHARACTER ENTERED ?
JNE ED_HD102 ; ...NO - CONTINUE
;
; ----- ZERO FILL THE LEADING BYTES IN THE BUFFER
;
MOV AH,ED_HD1BD ; GET THE DATA BYTE IN AH
MOV WORD PTR ED_HD1BD,'00' ; LEADING ZERO FILL
MOV ED_HD1BD+2,AH ; PUT THE CHAR IN BFR
ED_HD102:
CMP ED_HD1BL,02H ; ONLY TWO CHARACTER ENTERED ?
JNE ED_HD103 ; ...NO - CONTINUE
;
; ----- ZERO FILL THE LEADING BYTES IN THE BUFFER
;
MOV AX,WORD PTR ED_HD1BD ; GET THE DATA BYTES IN AX
MOV ED_HD1BD,'0' ; LEADING ZERO FILL
MOV WORD PTR ED_HD1BD+1,AX ; DATA BACK TO BUFFER
ED_HD103:
;
; ----- VALIDATE THE CHARACTERS IN THE BUFFER
;
CMP ED_HD1BD,'0' ; IS IT LESS THAN '0'
JB ED_HD1E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD1BD,'2' ; GREATER THAN 2 ?
JA ED_HD1E1 ; ...YES - ERROR
;
CMP ED_HD1BD+1,'0' ; IS IT LESS THAN '0'
JB ED_HD1E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD1BD+1,'9' ; GREATER THAN 9 ?
JA ED_HD1E1 ; ...YES - ERROR
;
CMP ED_HD1BD+2,'0' ; IS IT LESS THAN '0'
JB ED_HD1E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_HD1BD+2,'9' ; GREATER THAN 9 ?
JLE ED_HD104 ; ...NO - CONTINUE
JMP ED_HD1E1 ; ...YES - ERROR
ED_HD104:
;
; ----- DIGITS ARE GOOD, CONVERT TO BINARY
;
MOV AX,WORD PTR ED_HD1BD+1 ; GET ASCII LOW 2 BYTES
CALL ED_CVB ; CONVERT TO BINARY
CMP ED_HD1BD,'2' ; HIGH DIGIT 2 ?
JNE ED_HD105 ; ...NO - CONTINUE
ADD AX,200D ; ...YES - ADD 200
ED_HD105:
CMP ED_HD1BD,'1' ; HIGH DIGIT A 1
JNE ED_HD106 ; ...NO - CONTINUE
ADD AX,100D ; YES - ADD 100
ED_HD106:
;
CMP AX,15 ; DRIVE TYPE 15 SPECIFIED ?
JNE ED_HD107 ; ...NO - CONTINUE
JMP ED_HD1E1 ; ...YES - ERROR
ED_HD107:
CMP AX,ED_MAXE-1 ; TYPE GT MAX EDDT TYPE ?
JLE ED_HD109 ; ...NO - CONTINUE
JMP ED_HD1E1 ; ...YES - ERROR
ED_HD109:
;
; ----- SET THE DRIVE TYPE IN CMOS
;
MOV ED_HD1E,AL ; SET THE EDDT EXTENDED TYPE
CMP AL,00H ; NO DRIVE ?
JE ED_FD000 ; ...YES - DO FLOPPYS
;-------------------------------------------------------------- 03/12/88
; 03/12/88
; NOTE: 03/12/88
; IN ORDER TO INITIALIZE INTERRUPT 13H ON SOME 03/12/88
; AT COMPATIBLES FIXED DRIVE 0 MUST BE DEFINED 03/12/88
; IN CMOS. SINCE THE ACTUAL DRIVE MAY NOT HAVE 03/12/88
; A CORRESPONDING IBM DRIVE TYPE WE MUST PICK 03/12/88
; ONE THAT MEETS THE FOLLOWING CRITERIA: 03/12/88
; 03/12/88
; (1) THE TYPE DEFINED MUST HAVE LESS THAT OR 03/12/88
; EQUAL TO THE PHYSICAL DRIVE'S NUMBER OF 03/12/88
; HEADS _AND_ NUMBER OF CYLINDERS. 03/12/88
; 03/12/88
; (2) IF THE PHYSICAL DRIVE HAS MORE THAN 8 03/12/88
; HEADS THE TYPE USED MUST HAVE A CONTROL 03/12/88
; BYTE VALUE OF 08H OR IT MUST NOT USE 03/12/88
; WRITE PRECOMPENSATION. 03/12/88
;-------------------------------------------------------------- 03/12/88
;
; ----- LOCATE THE TABLE ENTRY FOR FIXED DRIVE 1 03/12/88
; 03/12/88
XOR BX,BX ; CLEAR BX 03/12/88
MOV BL,AL ; GET DRIVE TYPE FOR DRIVE 1 03/12/88
DEC BX ; ADJUST FOR TABLE BASE 03/12/88
SHL BX,04H ; *10H FOR TABLE OFFSET 03/12/88
MOV AL,BYTE PTR ED_TABLE+2[BX] ; GET NUMBER OF HEADS 03/12/88
CMP AL,09H ; NINE OR MORE HEADS ? 03/12/88
JNL ED_H1GT8 ; ...YES - GO ADJUST 03/12/88
OR ED_HDTYP,01H ; SET DRIVE 0 TO BIOS TYPE 1 03/12/88
JMP ED_FD000 ; DO FLOPPY'S 03/12/88
ED_H1GT8: ; 03/12/88
OR ED_HDTYP,06H ; SET DRIVE 0 TO BIOS TYPE 6 03/12/88
ED_FD000:
;
; ----- READ THE TYPE FOR FLOPPY DRIVE 0
;
CSRP ED_FD0IN ; POSITION CURSOR FOR INPUT
;
ED_FD0RD: ; READ THE TYPE
READK ED_FD0BF ; WAIT FOR INPUT
WCS ED_INVMB ; BLANK ERROR MESSAGE FIELD
;
; ----- VALIDATE THE TYPE FOR DRIVE 0
;
CMP ED_FD0BL,00H ; ONLY CARRIAGE RETURN ENTERED ?
JNE ED_FD001 ; ...NO - CONTINUE
ED_FD0E1: ; ERROR ROUTINE
MOV BX,02H ; BEEP DURATION
CALL ED_BEEP ; SOUND BEEP
WCS ED_FD0IN ; CLEAR THE FIELD
CSRP ED_FD0IN ; POSITION CURSOR
JMP ED_FD0RD
ED_FD001:
;
; ----- VALIDATE THE CHARACTERS IN THE BUFFER
;
CMP ED_FD0BD,'0' ; IS FD0 TYPE '0'
JNE ED_FD0NZ ; ...NO - CONTINUE
WCS ED_INVM3 ; WRITE ERROR MESSAGE
MOV BX,3 ; BEEP COUNT
CALL ED_BEEP ; BEEP THE SPEAKER
JMP ED_FD0E1 ; GO TRY AGAIN
ED_FD0NZ:
CMP ED_FD0BD,'0' ; IS IT LESS THAN '0'
JB ED_FD0E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_FD0BD,'4' ; GREATER THAN FOUR ?
JA ED_FD0E1 ; ...YES - ERROR
;
; ----- DIGIT IS GOOD, CONVERT TO BINARY
;
AND ED_FD0BD,0FH ; CONVERT TO BINARY
;
; ----- WE NOW HAVE THE DRIVE TYPE IN AL SAVE IT IN OUR CMOS IMAGE
;
AND ED_FDTYP,00FH ; CLEAR ANY OLD TYPE IN CMOS
MOV AL,ED_FD0BD ; GET TYPE IN AX
SHL AL,4 ; GET IN HIGH ORDER
OR ED_FDTYP,AL ; PUT OURS IN CMOS
;
ED_FD100:
;
; ----- READ THE TYPE FOR FLOPPY DRIVE 1
;
CSRP ED_FD1IN ; POSITION CURSOR FOR INPUT
;
ED_FD1RD: ; READ THE TYPE
READK ED_FD1BF ; WAIT FOR INPUT
;
; ----- VALIDATE THE TYPE FOR DRIVE 1
;
CMP ED_FD1BL,00H ; ONLY CARRIAGE RETURN ENTERED ?
JNE ED_FD101 ; ...NO - CONTINUE
ED_FD1E1: ; ERROR ROUTINE
MOV BX,02H ; BEEP DURATION
CALL ED_BEEP ; SOUND BEEP
WCS ED_FD1IN ; CLEAR THE FIELD
CSRP ED_FD1IN ; POSITION CURSOR
JMP ED_FD1RD
ED_FD101:
;
; ----- VALIDATE THE CHARACTERS IN THE BUFFER
;
CMP ED_FD1BD,'0' ; IS IT LESS THAN '0'
JB ED_FD1E1 ; ...YES - GO TO ERROR ROUTINE
CMP ED_FD1BD,'4' ; GREATER THAN FOUR ?
JA ED_FD1E1 ; ...YES - ERROR
;
; ----- DIGIT IS GOOD, CONVERT TO BINARY
;
AND ED_FD1BD,0FH ; CONVERT TO BINARY
;
; ----- WE NOW HAVE THE DRIVE TYPE IN AL SAVE IT IN OUR CMOS IMAGE
;
MOV AL,ED_FD1BD ; GET TYPE IN AL
AND ED_FDTYP,0F0H ; CLEAR ANY OLD TYPE IN CMOS
OR ED_FDTYP,AL ; PUT OURS IN CMOS
;
ED_FD110:
ED_YN:
;
; ----- ASK OPERATOR TO CONFIRM DATA ENTERED
;
WCS ED_CONF ; WRITE CONFIRMATION MESSAGE
;
MOV AH,0CH ; PRUGE KEYBOARD BUFFER
MOV AL,08H ; AND READ A CHARACTER
INT 21H ; RUPT TO DOS
;
CMP AL,'Y' ; ...ANSWER YES ?
JE ED_CMCKS ; YES - CONTINUE
CMP AL,'N' ; ...ANSWER NO
JE ED_LOOP ; YES - DO IT AGAIN
CMP AL,'y' ; ...ANSWER YES ?
JE ED_CMCKS ; YES - CONTINUE
CMP AL,'n' ; ...ANSWER NO
JE ED_LOOP ; YES - DO IT AGAIN
JMP ED_BADA ; BAD ANSWER
ED_LOOP: JMP ED_GO ; LOOP TO FAR ADDRESS (START)
ED_BADA:
;
; ----- INVALID ANSWER, BEEP & TRY AGAIN
;
MOV BX,2 ; BEEP COUNT
CALL ED_BEEP ; CALL BEEP ROUTINE
JMP ED_YN ; DO IT AGAIN
ED_CMCKS:
;
; ----- WE NOW HAVE CMOS SETUP, CHECKSUM IT
;
LEA DX,ED_CMOS ; GET ADDRESS OF CMOS DATA AREA
CALL CMOSCHKS ; CALL CHECKSUM ROUTINE
;
; ----- NOW WRITE THE CMOS BACK TO HARDWARE
;
LEA DX,ED_CMOS ; GET ADDRESS OF CMOS DATA AREA
CALL CMOSWRIT ; CALL CHECKSUM ROUTINE
;
CLS ; CLEAR THE SCREEN
;
; ----- RETURN TO DOS
;
ED_EXIT:
MOV AH,04CH ; TERMINATE FUNCTION
MOV AL,00H ; RETURN CODE
INT 21H ; DOS RUPT
;
; ----- SUBROUTINE TO BEEP THE SPEAKER
; ----- BX HAS A VALUE FOR DURATION OF THE BEEP
;
ED_BEEP PROC NEAR ; ROUTINE TO BEEP THE SPEAKER
PUSHA ; SAVE REGS
CLI ; RUPTS OFF
MOV AL,0B6H ; SEL TIM 2,LSB,MSB
OUT 043H,AL ; SET TIMER MODE REG
MOV AX,0533H ; DIVISOR FOR 1000HZ
OUT 042H,AL ; TIMER CNT - LSB
MOV AL,AH ; TIMER 2 CNT - MSB
OUT 042H,AL ; SEND THE BYTE
IN AL,061H ; GET CURRENT PORT VALUE
MOV AH,AL ; SAVE IN AH
OR AL,03H ; SPEAKER ON
OUT 061H,AL ; SEND SPKR ON VAL
SUB CX,CX ; ZERO CX REG
ED_BEEP1: ; LOOP TO BEEP
LOOP ED_BEEP1 ; LOOP 'TIL CX 0
DEC BL ; COUNT DONE ??
JNZ ED_BEEP1 ;
MOV AL,AH ; RESTORE SAVED VALUE
OUT 061H,AL ; SEND TO PORT
POPA ; RESTORE REGS
RET ;
ED_BEEP ENDP ; END OF PROC
;
; ----- CONVERT THE CHARACTERS IN AX TO BINARY
;
ED_CVB PROC NEAR ; ASCII TO BINARY CONVERSION ROUTINE
;
; NOTE :
; THE CHARACTERS SHOULD HAVE BEEN CHECKED PREVIOUSLY
; SO NO INPUT VALIDATION WILL BE DONE.
;
PUSH BX ; SAVE BX REGISTER CONTENTS
PUSH CX ; SAVE CX REGISTER CONTENTS
PUSH SI ; SAVE SI REGISTER CONTENTS
;
MOV BX,AX ; GET AX CONTENTS IN WORK REG
AND AX,000FH ; SAVE ONLY THE LOW NIBBLE
MOV SI,10 ; GET THE POSITIONAL VALUE
MUL SI ; MULTIPLY AX BY 10
MOV CL,8 ; GET SHIFT COUNT OF 8
SHR BX,CL ; MOVE HIGH BYTE DOWN
AND BX,000FH ; ISOLATE LOW ORDER DIGIT
ADD AX,BX ; AND ADD IT TO THE SUM
;
POP SI ; RESTORE SI REGISTER
POP CX ; RESTORE CX REGISTER
POP BX ; RESTORE BX REGISTER
RET ; RETURN TO CALLER
ED_CVB ENDP ; END OF PROCEDURE
ED_MAIN ENDP ; END OF PROCEDURE
ED_CODE ENDS ; CODE SEGMENT END
END ED_START